/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.internos.superclasses.ControleBoletins;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.gui.utils.EnabledGUIElements;
import controle.interfaces.Constantes;
import controle.utils.Horas;
import gui.componentes.MascarasJTextField;
import gui.frames.internos.IFVisitaTratamento;
import java.sql.Time;
import java.text.ParseException;
import java.util.*;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import modelo.*;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Administrador
 */
public class ControleVisitaTratamento extends ControleBoletins {

    //Boletimtratamento boletim;
    private IFVisitaTratamento frame;
    private ControleBoletimTratamento controleBoletim;
    private Boletimtratamento boletimTratamento = null;
    private int linhaSelecionada = -1;
    private boolean boletimAtivo = true;
    //Variáveis da classe
    Quadra quadra = null;
    Logradouro logradouro = null;

    public ControleVisitaTratamento(IFVisitaTratamento frame, ControleBoletimTratamento controleBoletim, Boletimtratamento boletimTratamento, boolean boletimAtivo) {
        super(frame);
        this.frame = frame;
        this.controleBoletim = controleBoletim;
        this.linhaSelecionada = -1;
        this.boletimAtivo = boletimAtivo;
        if (boletimTratamento == null) {
            this.boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        } else {
            this.boletimTratamento = boletimTratamento;
        }
    }

    public void inicializa() {

        frame.setVisible(true);
        if (!this.inicializaComboBoxQuadra()) {
            frame.dispose();
        }
    }

    public void guiAtiva(boolean estado) {

        if (!estado) {
            EnabledGUIElements.disabledJComponent(frame.comboQuadra, frame.radioFechada, frame.radioNenhuma,
                    frame.radioRecusada, frame.radioResgatada, frame.comboTipoUnidade, frame.textDepTratados, frame.checkUltimaVisitaBoletim, frame.buttonLimpar,
                    frame.comboImovel, frame.comboLogradouro, frame.radioAdulticidaNaoUsado, frame.radioAdulticidaNovoPacote, frame.radioAdulticidaPacoteUsado,
                    frame.radioLarvicidaNaoUsado, frame.radioLarvicidaNovoPacote, frame.radioLarvicidaPacoteUsado);
        } else {
            EnabledGUIElements.enabledJComponent(frame.comboQuadra, frame.radioFechada, frame.radioNenhuma,
                    frame.radioRecusada, frame.radioResgatada, frame.comboTipoUnidade, frame.textDepTratados, frame.checkUltimaVisitaBoletim, frame.buttonLimpar,
                    frame.comboImovel, frame.comboLogradouro, frame.radioAdulticidaNaoUsado, frame.radioAdulticidaNovoPacote, frame.radioAdulticidaPacoteUsado,
                    frame.radioLarvicidaNaoUsado, frame.radioLarvicidaNovoPacote, frame.radioLarvicidaPacoteUsado);
        }
        eventoPendencias();
    }

    /**
     * Limpa os elementos de
     *
     * @frame
     */
    public void limparGUI() {
        new ApagaElementosDaInterface().apagaJTextField(frame.textDepTratados, frame.textIdImovel,
                frame.textIdLogradouro, frame.textCodigoQuadra);
        new ApagaElementosDaInterface().apagaJComboBox(frame.comboImovel, frame.comboLogradouro, frame.comboQuadra, frame.comboTipoUnidade);
        EnabledGUIElements.disabledJComponent(frame.comboLogradouro, frame.comboImovel);
        frame.groupPendencia.clearSelection();
        frame.radioNenhuma.setSelected(true);
        frame.radioAdulticidaNaoUsado.setSelected(true);
        frame.radioLarvicidaNaoUsado.setSelected(true);
        frame.checkUltimaVisitaBoletim.setSelected(false);
        frame.checkQuartConcluido.setSelected(false);
        this.boletimTratamento = null;
    }

    /**
     * Cria a visita
     *
     * @return
     */
    public Visitatratamento criaVisita() {

        Visitatratamento visita = new Visitatratamento();

        //Verifica se os campos estão preenchidos
        //Verifica se a quadra foi definida
        if (frame.comboQuadra.getSelectedIndex() != 0) {
            //Verifica se o logradouro foi definido
            if (frame.comboLogradouro.getSelectedIndex() != 0) {
                //Verifica se o imóvel foi definido
                if (frame.comboImovel.getSelectedIndex() != 0) {
                    //Verifica se o tipo de unidade foi definido
                    if (frame.comboTipoUnidade.getSelectedIndex() != 0) {
                        //Verifica se o campo Dep. Tratados foi preenchido
                        if (!frame.textDepTratados.getText().isEmpty()) {

                            try {

                                //Cria um boletim na memória a partir do Iframe @IFBoletimTratamento
                                if (boletimTratamento == null) {
                                    boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
                                }

                                //Captura a hora
                                Time hora;
                                if (frame.textHora.getText().isEmpty()) {
                                    hora = Horas.getHoraAgora();
                                } else {
                                    hora = Horas.getTime(frame.textHora.getText());
                                }
                                //Captura a pendência
                                boolean penFech = frame.radioFechada.isSelected();
                                boolean penRec = frame.radioRecusada.isSelected();
                                boolean penResg = frame.radioResgatada.isSelected();

                                Quadra quadra = (Quadra) AbstractDAO.consultar("Quadra", "idLocalidade=" + boletimTratamento.getLocalidade().getIdLocalidade() + " AND codigo='" + frame.comboQuadra.getSelectedItem() + "'").get(0);
                                //Verifica se esta quadra foi concluída
                                Integer idVisitaAtual = null;
                                if(!frame.textIdVisita.getText().isEmpty()){
                                    idVisitaAtual = Integer.parseInt(frame.textIdVisita.getText());
                                }
                                if (this.verificaQuadraConcluida(controleBoletim.setVisitas, quadra, idVisitaAtual)) {
                                    JOptionPane.showMessageDialog(frame,
                                            "Esta quadra já foi concluída neste boletim",
                                            "Atenção!", JOptionPane.WARNING_MESSAGE);
                                    return null;
                                }
                                
                                Logradouro log = (Logradouro) AbstractDAO.consultar("Logradouro", "idMunicipio=" + boletimTratamento.getMunicipio().getIdMunicipio() + " AND nome='" + frame.comboLogradouro.getSelectedItem() + "'").get(0);
                                StringTokenizer tok = new StringTokenizer(frame.comboImovel.getSelectedItem().toString(), " - ");
                                String numeroImovel = tok.nextToken();
                                String compImovel = tok.nextToken("").replaceAll(" - ", "");
                                if (compImovel.equals("")) {
                                    compImovel = "' AND complemento is null";

                                } else {
                                    compImovel = "' AND complemento='" + compImovel + "'";
                                }
                                Imovel imo = (Imovel) AbstractDAO.consultar("Imovel", "idLogradouro=" + log.getIdLogradouro() + " AND numero='" + numeroImovel
                                        + compImovel).get(0);
                                int larv = -1;
                                int adul = -1;
                                String tipo = frame.comboTipoUnidade.getSelectedItem().toString();
                                int dep = new MascarasJTextField().getInteger(frame.textDepTratados);
                                boolean ult = frame.checkUltimaVisitaBoletim.isSelected();

                                //Adulticida
                                if (frame.radioAdulticidaNovoPacote.isSelected()) {
                                    adul = Constantes.NOVO_PACOTE;

                                } else if (frame.radioAdulticidaPacoteUsado.isSelected()) {
                                    adul = Constantes.PACOTE_USADO;

                                } else {
                                    adul = Constantes.NAO_USADO;
                                }

                                //Larvicida
                                if (frame.radioLarvicidaNovoPacote.isSelected()) {
                                    larv = Constantes.NOVO_PACOTE;

                                } else if (frame.radioLarvicidaPacoteUsado.isSelected()) {
                                    larv = Constantes.PACOTE_USADO;

                                } else {
                                    larv = Constantes.NAO_USADO;
                                }

                                visita = new Visitatratamento(quadra, log, imo, tipo, larv, adul, penRec, penFech, penResg, dep, ult, frame.checkQuartConcluido.isSelected(), hora);

                                //Verifica o Id da visita
                                if (!frame.textIdVisita.getText().trim().isEmpty()) {
                                    visita.setIdVisitaTratamento(Integer.parseInt(frame.textIdVisita.getText()));
                                }

                                //Verifica o Id do boletim
                                if (!frame.textIdBoletim.getText().trim().isEmpty()) {
                                    visita.setBoletimtratamento((Boletimtratamento) AbstractDAO.consultar("Boletimtratamento", "idBoletimTratamento=" + new MascarasJTextField().getInteger(frame.textIdBoletim)).get(0));
                                }

                                return visita;

                            } catch (ParseException ex) {
                                JOptionPane.showMessageDialog(frame, "Erro ao manipular a Hora.", "Erro", JOptionPane.ERROR_MESSAGE);
                            }
                        } else {
                            JOptionPane.showMessageDialog(frame, "O campo Depósitos Tratados deve ser preenchido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                        }

                    } else {
                        JOptionPane.showMessageDialog(frame, "O tipo de unidade deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(frame, "O imóvel deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                }
            } else {

                JOptionPane.showMessageDialog(frame, "O logradouro deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "A quadra deve ser definida.", "Atenção!", JOptionPane.WARNING_MESSAGE);
        }

        return null;

    }

    /**
     * Exibe a visita na GUI que foi selecionada na tabela de visitas do boletim
     */
    public void preencheGUI() {

        DefaultTableModel modeloVisitas = (DefaultTableModel) controleBoletim.frame.tabelaVisitas.getModel();

        //Captura a linha selecionada na tabela
        linhaSelecionada = controleBoletim.frame.tabelaVisitas.getSelectedRow();

        Visitatratamento visita = null;

        //Captura a visita na HashSet de visitas do boletim
        List<Visitatratamento> list = new ArrayList<Visitatratamento>((Set<Visitatratamento>) controleBoletim.setVisitas);

        for (int index = 0; index < list.size(); index++) {
            if (modeloVisitas.getValueAt(linhaSelecionada, 0) != null && list.get(index).getIdVisitaTratamento() != null) {
                if (list.get(index).getIdVisitaTratamento().equals(Integer.parseInt(modeloVisitas.getValueAt(linhaSelecionada, 0).toString()))) {
                    visita = list.get(index);
                    break;
                } else {
                    visita = null;
                }
            } else if (!modeloVisitas.getValueAt(linhaSelecionada, 1).toString().isEmpty() && list.get(index).getHora() != null) {
                if (modeloVisitas.getValueAt(linhaSelecionada, 1).toString().equals(list.get(index).getHora().toString())) {
                    visita = list.get(index);
                    break;
                } else {
                    visita = null;
                }
            }
        }

        if (visita != null) {
            //Preenche os elementos da GUI
            if (modeloVisitas.getValueAt(linhaSelecionada, 0) != null) {
                frame.textIdVisita.setText(modeloVisitas.getValueAt(linhaSelecionada, 0).toString());
            }
            String complemento = "";
            if (visita.getImovel().getComplemento() != null) {
                complemento = visita.getImovel().getComplemento();
            }
            frame.textIdBoletim.setText(controleBoletim.frame.textId.getText());
            frame.textHora.setText(visita.getHora().toString());
            frame.textCodigoQuadra.setText(visita.getQuadra().getIdQuadra().toString());
            frame.comboQuadra.setSelectedItem(visita.getQuadra().getCodigo());
            frame.textIdLogradouro.setText(visita.getLogradouro().getIdLogradouro().toString());
            frame.comboLogradouro.setSelectedItem(visita.getLogradouro().getNome());
            frame.textIdImovel.setText(visita.getImovel().getIdImovel().toString());
            frame.comboImovel.setSelectedItem(visita.getImovel().getNumero() + " - " + complemento);
            frame.comboTipoUnidade.setSelectedItem(visita.getTipoUnidade());
            frame.textDepTratados.setText(visita.getDepositosTratados() + "");
            frame.checkUltimaVisitaBoletim.setSelected(visita.isUltimaVisitaBoletim());
            frame.checkQuartConcluido.setSelected(visita.isQuadraConcluida());

            //Adulticida
            if (visita.getInseticidaAdulticida() == Constantes.NOVO_PACOTE) {
                frame.radioAdulticidaNovoPacote.setSelected(true);

            } else if (visita.getInseticidaAdulticida() == Constantes.PACOTE_USADO) {
                frame.radioAdulticidaPacoteUsado.setSelected(true);

            } else {
                frame.radioAdulticidaNaoUsado.setSelected(true);
            }

            //Larvicida
            if (visita.getInseticidaLarvicida() == Constantes.NOVO_PACOTE) {
                frame.radioLarvicidaNovoPacote.setSelected(true);

            } else if (visita.getInseticidaLarvicida() == Constantes.PACOTE_USADO) {
                frame.radioLarvicidaPacoteUsado.setSelected(true);

            } else {
                frame.radioLarvicidaNaoUsado.setSelected(true);
            }

            //Define a pendencia
            if (visita.getPendenciaFech()) {
                frame.radioFechada.setSelected(true);
            } else if (visita.getPendenciaRec()) {
                frame.radioRecusada.setSelected(true);
            } else if (visita.getPendenciaResg()) {
                frame.radioResgatada.setSelected(true);
            } else {
                frame.radioNenhuma.setSelected(true);
            }


            this.guiAtiva(boletimAtivo);
        }
    }

    /**
     * Inserir a compra/venda do produto na tabela de produtos
     */
    public void inserirAlterarLinha() {

        //Verifica se o boletim está ativo
        if (this.boletimAtivo) {

            //Captura o objeto
            Visitatratamento visita = this.criaVisita();

            if (visita != null) {

                //Verifica se a visita será inserido na tabela ou se simplesmente aterará uma linha
                if (frame.textIdVisita.getText().trim().isEmpty() && linhaSelecionada == -1) {

                    //Insere a visita no objeto
                    controleBoletim.setVisitas.add(visita);
                    controleBoletim.setTabelaVisitas();

                } else {

                    //Altera a visita no objeto
                    List<Visitatratamento> list = new ArrayList<Visitatratamento>(controleBoletim.setVisitas);
                    list.set(linhaSelecionada, visita);
                    controleBoletim.setVisitas = new TreeSet<Visitatratamento>(list);
                    controleBoletim.setTabelaVisitas();

                }

                frame.dispose();

            }
        }

    }

    /**
     * Evento do ComboBox de Logradouro
     */
    public void comboBoxLogradouroCarregaComboBoxImovel() {

        if (boletimTratamento == null) {
            boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (frame.comboLogradouro.getSelectedIndex() != 0) {
            if (frame.comboLogradouro.getSelectedItem() != null) {
                String nomeLog = frame.comboLogradouro.getSelectedItem().toString();

                if (boletimTratamento.getLocalidade() != null) {
                    this.logradouro = (Logradouro) AbstractDAO.consultar("Logradouro", "nome='" + nomeLog + "' AND idMunicipio=" + boletimTratamento.getMunicipio().getIdMunicipio()).get(0);

                    List<Imovel> listImo = AbstractDAO.consultar(
                            "from Imovel i left join fetch i.logradouro lg left join fetch i.quadra q where lg.idLogradouro="
                            + this.logradouro.getIdLogradouro() + " AND q.idQuadra=" + this.quadra.getIdQuadra() + " order by numero, complemento");

                    if (listImo.size() > 0) {
                        frame.comboImovel.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", listImo));
                        frame.comboImovel.setEnabled(true);

                    } else {
                        frame.comboImovel.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));
                        frame.comboImovel.setEnabled(false);
                        JOptionPane.showMessageDialog(frame, "Este logradouro ainda não tem nenhum imóvel cadastrado.", "Atenção", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    frame.comboImovel.setEnabled(false);
                    JOptionPane.showMessageDialog(frame, "Favor selecionar uma localidade para o boletim.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                }
            }
        } else {
            frame.comboImovel.setSelectedIndex(0);
            frame.comboImovel.setEnabled(false);
        }
    }

    /**
     * Inicializa o comboBox de Quadras
     */
    public boolean inicializaComboBoxQuadra() {

        if (boletimTratamento == null) {
            boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (boletimTratamento.getMunicipio() != null) {
            if (boletimTratamento.getLocalidade() != null) {
                List<Quadra> listQuaCodigo = AbstractDAO.consultar(
                        "from Quadra q left join fetch q.localidade l where l.idLocalidade=" + boletimTratamento.getLocalidade().getIdLocalidade() + " order by q.codigo");
                if (listQuaCodigo.size() > 0) {
                    frame.comboQuadra.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", listQuaCodigo));
                    return true;
                } else {
                    JOptionPane.showMessageDialog(frame, "A localidade selecionada no boletim não tem nenhuma quadra cadastrada.", "Atenção", JOptionPane.WARNING_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(frame, "A localidade do boletim não foi selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "O município do boletim não foi selecionado.", "Atenção", JOptionPane.WARNING_MESSAGE);
        }

        return false;
    }

    /**
     * Inicializa o comboBox de Logradouro
     */
    public boolean inicializaComboBoxLogradouro() {

        if (boletimTratamento == null) {
            boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (boletimTratamento.getLocalidade() != null) {
            if (frame.comboQuadra.getSelectedIndex() > 0 && this.quadra != null) {

                List<String> list = this.getListLogradourosPorQuadra(this.quadra);
                DefaultComboBoxModel model = new DefaultComboBoxModel();
                model.addElement("Selecione...");
                for (int i = 0; i < list.size(); i++) {
                    model.addElement(list.get(i));
                }
                frame.comboLogradouro.setModel(model);
                return true;

            } else {
                JOptionPane.showMessageDialog(frame, " A quadra deve ser selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "A localidade do boletim não foi selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
        }

        return false;
    }

    /**
     * Realiza o evento do comboboxQuadra
     *
     * @return
     */
    public boolean eventoComboBoxQuadra(JComboBox comboQuadra, JComboBox comboLogradouro, JComboBox comboImovel) {

        if (boletimTratamento == null) {
            boletimTratamento = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (comboQuadra.getSelectedIndex() > 0) {

            //Captura a quadra selecionada
            List<Quadra> listQua = AbstractDAO.consultar("Quadra", "idLocalidade=" + boletimTratamento.getLocalidade().getIdLocalidade() + " AND codigo=" + comboQuadra.getSelectedItem().toString());

            if (listQua.isEmpty()) {
                EnabledGUIElements.disabledJComponent(comboLogradouro, comboImovel);
                new ApagaElementosDaInterface().apagaModelJComboBox(comboLogradouro, comboImovel);
                this.quadra = null;
                return false;

            } else {
                EnabledGUIElements.enabledJComponent(comboLogradouro);
                this.quadra = listQua.get(0);

            }

            //Carrega o combobox de logradouro
            if (this.inicializaComboBoxLogradouro()) {
                return true;
            }
        } else {
            comboLogradouro.setSelectedIndex(0);
            comboImovel.setSelectedIndex(0);
            comboLogradouro.setEnabled(false);
            comboImovel.setEnabled(false);
        }
        return false;
    }

    /**
     * Caso uma pendência seja recusada ou fechada, os campos Adulticida,
     * Larvicida e Dep. Tratados são desativados.
     */
    public void eventoPendencias() {

        if (frame.radioFechada.isSelected() || frame.radioRecusada.isSelected()) {
            EnabledGUIElements.disabledJComponent(frame.radioAdulticidaNaoUsado, frame.radioAdulticidaNovoPacote, frame.radioAdulticidaPacoteUsado,
                    frame.radioLarvicidaNaoUsado, frame.radioLarvicidaNovoPacote, frame.radioLarvicidaPacoteUsado, frame.textDepTratados);
            frame.textDepTratados.setText("0");

        } else {
            EnabledGUIElements.enabledJComponent(frame.radioAdulticidaNaoUsado, frame.radioAdulticidaNovoPacote, frame.radioAdulticidaPacoteUsado,
                    frame.radioLarvicidaNaoUsado, frame.radioLarvicidaNovoPacote, frame.radioLarvicidaPacoteUsado, frame.textDepTratados);


        }

    }

    @Override
    public void editarVisita() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public DefaultTableModel getModelTabelaVisitas() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Integer linhaSelecionadaTabelaVisitas() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
